#ifndef __STORE_H__
#define __STORE_H__

#include <vector>
#include <string>
#include <memory>

namespace StoreSystem {

    //基础物品类，所有商店物品的基类
    class StoreItem {
    public:
        /*
            itemName：物品名称
            description：物品描述
            price：价格
        */
        StoreItem(const std::string& itemName, const std::string& description, int price);

        virtual ~StoreItem() = default;

        //获取物品名称
        std::string getName() const;

        //获取物品描述
        std::string getDescription() const;

        //获取物品价格
        int getPrice() const;

        //显示物品详情
        virtual void displayDetails() const;

    protected:
        std::string name;        //名称
        std::string description; //描述
        int price;               //价格
    };

    //消耗品基类（红瓶、蓝瓶、熏香）
    class Consumable : public StoreItem {
    public:
        /*
            itemName：物品名称
            description：物品描述
            price：价格
            effectValue：效果值
        */
        Consumable(const std::string& itemName, const std::string& description,
            int price, int effectValue);

        //获取效果值
        int getEffectValue() const;

        //显示物品详情
        void displayDetails() const override;

    private:
        int effectValue;//效果值
    };

    //饰品基类
    class Accessory : public StoreItem {
    public:
        /*
            itemName：物品名称
            description：物品描述
            price：价格
            boostValue：提升值
        */
        Accessory(const std::string& itemName, const std::string& description,
            int price, int boostValue);

        //获取提升值
        int getBoostValue() const;

        //显示物品详情
        void displayDetails() const override;

    private:
        int boostValue;//提升值
    };

    //红瓶
    class HealthPotion : public Consumable {
    public:
        /*
            itemName：物品名称
            effectValue：效果值
            price：价格
        */
        HealthPotion(const std::string& itemName, int effectValue, int price);
    };

    //蓝瓶
    class ManaPotion : public Consumable {
    public:
        /*
            itemName：物品名称
            effectValue：效果值
            price：价格
        */
        ManaPotion(const std::string& itemName, int effectValue, int price);
    };

    //熏香
    class Incense : public Consumable {
    public:
        /*
            itemName：物品名称
            effectValue：效果值
            price：价格
        */
        Incense(const std::string& itemName, int effectValue, int price);
    };

    //幸运饰品
    class LuckAccessory : public Accessory {
    public:
        /*
            itemName：物品名称
            boostValue：提升值
            price：价格
        */
        LuckAccessory(const std::string& itemName, int boostValue, int price);
    };

    //准确度饰品
    class AccuracyAccessory : public Accessory {
    public:
        /*
            itemName：物品名称
            boostValue：提升值
            price：价格
        */
        AccuracyAccessory(const std::string& itemName, int boostValue, int price);
    };

    //躲避饰品
    class DodgeAccessory : public Accessory {
    public:
        /*
            itemName：物品名称
            boostValue：提升值
            price：价格
        */
        DodgeAccessory(const std::string& itemName, int boostValue, int price);
    };

    //敏捷饰品
    class AgilityAccessory : public Accessory {
    public:
        /*
            itemName：物品名称
            boostValue：提升值
            price：价格
        */
        AgilityAccessory(const std::string& itemName, int boostValue, int price);
    };

    //鞋子
    class Shoe : public Accessory {
    public:
        /*
            itemName：物品名称
            boostType：属性提升类型
            boostValue：提升值
            price：价格
        */
        Shoe(const std::string& itemName, const std::string& boostType, int boostValue, int price);

        //显示物品详情
        void displayDetails() const override;

    private:
        std::string boostType;//属性提升类型
    };

    //头盔
    class Helmet : public Accessory {
    public:
        /*
            itemName：物品名称
            boostType：属性提升类型
            boostValue：提升值
            price：价格
        */
        Helmet(const std::string& itemName, const std::string& boostType, int boostValue, int price);

        //显示物品详情
        void displayDetails() const override;

    private:
        std::string boostType;
    };

    //武器
    class Weapon : public Accessory {
    public:
        /*
            itemName：物品名称
            boostType：属性提升类型
            boostValue：提升值
            price：价格
        */
        Weapon(const std::string& itemName, const std::string& boostType, int boostValue, int price);

        //显示物品详情
        void displayDetails() const override;

    private:
        std::string boostType;
    };

    //防具
    class Armor : public Accessory {
    public:
        /*
            itemName：物品名称
            boostType：属性提升类型
            boostValue：提升值
            price：价格
        */
        Armor(const std::string& itemName, const std::string& boostType, int boostValue, int price);

        //显示物品详情
        void displayDetails() const override;

    private:
        std::string boostType;
    };

    //商店
    class Store {
    public:
        Store();

        //初始化商品库存
        void initializeInventory();

        //添加商品到库存
        void addItem(std::unique_ptr<StoreItem> item);

        //显示所有商品
        void displayInventory() const;

        //购买商品
        bool purchaseItem(int index, int& playerMoney);

    private:
        std::vector<std::unique_ptr<StoreItem> > inventory; //商品库存
    };

}

#endif // __STORE_H__